/*
 * Copyright (c) 2008, 2009, 2010, 2011 Denis Tulskiy
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * version 3 along with this work.  If not, see <http://www.gnu.org/licenses/>.
 */

package com.tulskiy.musique.util;

import java.io.File;
import java.util.List;
import java.util.Set;

import android.annotation.SuppressLint;

import com.tulskiy.musique.model.FieldValues;

/**
 * @Author: Denis Tulskiy
 * @Date: 21.11.2008
 */
public class Util {
	public static String htmlToString(String string) {
		String ans = string.replaceAll("&quot;", "\"");
		ans = ans.replaceAll("&amp;", "&");
		ans = ans.replaceAll("&lt;", "<");
		ans = ans.replaceAll("&gt;", ">");
		ans = ans.replaceAll("<.+?>", "");

		return ans;
	}

	public static String formatSeconds(double seconds, int precision) {
		int min = (int) ((Math.round(seconds)) / 60);
		int hrs = min / 60;
		if (min > 0)
			seconds -= min * 60;
		if (seconds < 0)
			seconds = 0;
		if (hrs > 0)
			min -= hrs * 60;
		int days = hrs / 24;
		if (days > 0)
			hrs -= days * 24;
		int weeks = days / 7;
		if (weeks > 0)
			days -= weeks * 7;

		StringBuilder builder = new StringBuilder();
		if (weeks > 0)
			builder.append(weeks).append("wk ");
		if (days > 0)
			builder.append(days).append("d ");
		if (hrs > 0)
			builder.append(hrs).append(":");
		if (hrs > 0 && min < 10)
			builder.append("0");
		builder.append(min).append(":");
		// int n = precision + ((precision == 0) ? 2 : 3);
		// String fmt = "%0" + n + "." + precision + "f";
		// builder.append(new Formatter().format(Locale.US, fmt, seconds));
		int sec = (int) seconds;
		if (sec < 10)
			builder.append("0");
		builder.append(Math.round(sec));
		return builder.toString();
	}

	public static String samplesToTime(long samples, int sampleRate,
			int precision) {
		if (samples <= 0)
			return "-:--";
		double seconds = AudioMath.samplesToMillis(samples, sampleRate) / 1000f;
		return formatSeconds(seconds, precision);
	}

	public static String getFileExt(File file) {
		return getFileExt(file.getName());
	}

	public static String removeExt(String s) {
		int index = s.lastIndexOf(".");
		if (index == -1)
			index = s.length();
		return s.substring(0, index);
	}

	public static String getFileExt(String fileName) {
		int pos = fileName.lastIndexOf(".");
		if (pos == -1)
			return "";
		return fileName.substring(pos + 1).toLowerCase();
	}

	public static String longest(String... args) {
		if (args.length == 0)
			return "";
		String longest = args[0] == null ? "" : args[0];
		for (String s : args)
			if (s != null && s.length() > longest.length())
				longest = s;
		return longest;
	}

	@SuppressLint("NewApi")
	public static String firstNotEmpty(String... values) {
		for (String value : values) {
			if (value != null && !value.isEmpty())
				return value;
		}

		return null;
	}

	@SuppressLint("NewApi")
	public static boolean isEmpty(String value) {
		return value == null || value.isEmpty();
	}

	public static boolean isEmpty(List values) {
		return values == null || values.isEmpty();
	}

	public static boolean isEmpty(Set values) {
		return values == null || values.isEmpty();
	}

	public static String humanize(String property) {
		String s = property.replaceAll("(?=\\p{Upper})", " ");
		return s.substring(0, 1).toUpperCase() + s.substring(1);
	}

	public static String capitalize(String str, String delim) {
		str = str.replaceAll("&", "and");
		String[] strings = str.split("[ _]+");
		final StringBuilder sb = new StringBuilder();

		for (String s : strings) {
			s = s.toLowerCase();
			sb.append(s.substring(0, 1).toUpperCase());
			sb.append(s.substring(1)).append(delim);
		}
		sb.deleteCharAt(sb.length() - 1);

		return sb.toString();
	}

	public static String center(String str, int maxSize, int size) {
		if (str == null || size <= 0 || str.length() >= maxSize) {
			return str;
		}
		int strLen = str.length();
		int pads = size - strLen;
		if (pads <= 0) {
			return str;
		}
		str = leftPad(str, strLen + pads / 2);
		str = rightPad(str, size);
		return str;
	}

	public static String rightPad(String s, int n) {
		return String.format("%1$-" + n + "s", s);
	}

	public static String leftPad(String s, int n) {
		return String.format("%1$#" + n + "s", s);
	}

	public static String formatFieldValues(Object values) {
		String result = null;

		if (values != null) {
			if (values instanceof String) {
				result = (String) values;
			} else if (values instanceof FieldValues) {
				FieldValues vs = (FieldValues) values;
				if (vs.size() > 1) {
					result = "<multiple values> " + vs.toString();
				} else {
					result = vs.toString();
				}
			}
		}

		return result;
	}

	public static String formatFieldValues(Object values, String separator) {
		if (values != null && separator != null) {
			if (values instanceof String) {
				return (String) values;
			} else if (values instanceof FieldValues) {
				StringBuilder sb = new StringBuilder();
				FieldValues vs = (FieldValues) values;
				for (int i = 0; i < vs.size(); i++) {
					String value = vs.get(i);
					if (sb.length() != 0) {
						sb.append(separator);
					}
					sb.append(value == null ? "" : value.toString());
				}
				return sb.toString();
			} else if (values instanceof Object[]) {
				StringBuilder sb = new StringBuilder();
				Object[] vs = (Object[]) values;
				for (int i = 0; i < vs.length; i++) {
					String value = vs[i].toString();
					if (sb.length() != 0) {
						sb.append(separator);
					}
					sb.append(value == null ? "" : value.toString());
				}
				return sb.toString();
			} else if (values instanceof List) {
				StringBuilder sb = new StringBuilder();
				List<Object> vs = (List<Object>) values;
				for (Object obj : vs) {
					String value = obj.toString();
					if (sb.length() != 0) {
						sb.append(separator);
					}
					sb.append(value == null ? "" : value.toString());
				}
				return sb.toString();
			}
		}

		return null;
	}
}